# -*-coding:Utf-8 -* 
"""@package core
@b Sealed Zone core
@brief Le package core est une extension des fonctionnalités du BGE.
Il se base sur le fichier game.blend pour fonctionner.

@b Sous-module :
	@li events - gestion des évenements
	@li inputs - gestion des entrés utilisateur [basé sur events]
	@li animation - fonctions d'animation [basé sur events]
	@li child - fonction de création de lien parent/enfant
	@li link - fonction de création de lien
	@li twin - fonction de création de lien entre classe

@b Sous-packages : 
	@li gui - Gestion d'interfaces graphiques
	@li gameplay - Outils pour le développement du gameplay
	@li load - Chargement de mods/maps

"""
import bge, bgl, blf, mathutils, aud, os, pickle, types, threading,sys
os.chdir(bge.logic.expandPath('//'))

## Variable global du module
SZ_Globals = {'AU_Device': aud.device(),
		'PATH':'//',
		'state':0,
		'state_func':{},
		'main_mod':'sealedzone',
		'level':None,
		'mousedbg':False,
		'init':None,
		'run':None,
		'run_lvl':None,
		'exit':None
		}

def getPath(path):
	"""Renvoi le chemin entier correspondant au paramètre donné
	@param path Le chemin relatif du fichier """
	return  os.normpath(bge.logic.expandPath(SZ_Globals['PATH']+path.lstrip('/')))

def setState(state):
	""" Change l'état générale du jeu.
	Pour créer un état, il faut définire au minimum une fonction qui sera appelé lors de l'entrée ou de la sortie dans cet état.
	@param state Le nom de l'état à prendre 
	@bug NEED FIX \> il n'existe aucune fonction pour référencer les fonctions d'entré/sortie d'un état
	"""
	if SZ_Globals['state'] in SZ_Globals['state_func'] and SZ_Globals['state_func'][SZ_Globals['state']][1] != None:
		SZ_Globals['state_func'][SZ_Globals['state']][1](SZ_Globals['state'],state)
	if state in SZ_Globals['state_func'] and SZ_Globals['state_func'][state][0] != None:
		SZ_Globals['state_func'][state][0](SZ_Globals['state'],state)
	SZ_Globals['state'] = state



def init(cont):
	""" Fonction d'initialisation ( première fonction appelé ) """
	SZ_Globals['core_func']['init'](cont)
	
def run(cont):
	""" Boucle générale ( dernière fonction éxécuté à chaque frame ) """
	SZ_Globals['core_func']['run'](cont)

def run_lvl(cont = None):
	""" Boucle du niveau ( fonction éxécuté dans la scène contenant le niveau à chaque frame ) """
	SZ_Globals['core_func']['run_lvl'](cont)
	
def exitgame(cont = None):
	""" Fonction de fin ( fonction appelé pour la fermeture du jeu ) """
	SZ_Globals['core_func']['exit'](cont)

from .common import *
from . import inputs, gui, gameplay, loading as load
load.Level()

SZ_Globals['mEvent'] = MASTER_EVENT()
SZ_Globals['lvl_mEvent'] = MASTER_EVENT('lvl')
SZ_Globals['2DScreen'] = gui.Screen(bge.render.getWindowWidth(),bge.render.getWindowHeight())
SZ_Globals['MainInputMap'] = inputs.InputMap()

SZ_Globals['2DScreen'].setLayer('loading')
SZ_Globals['loading'] = (gui.Box(SZ_Globals['2DScreen'],0,0,1.0,1.0,gui.Image("//resources/textures/gui/loading.png")),gui.LevelBar(SZ_Globals['2DScreen'],0,0,1.0,10))
SZ_Globals['loading'][1].bar.color = gui.Color((0.478431373,.0,0.0))
SZ_Globals['2DScreen'].setLayer()

SZ_Globals['core_func'] = {
	'init':load.init_game,
	'run':load.run_wait_start,
	'run_lvl':load.run_lvl,
	'exit':load.exit_game
}

bge.core = sys.modules[__name__]
